#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time        : 2022/6/22 12:04
# @Author      : Mini-Right
# @Email       : www@anyu.wang
# @File        : decrypt.py
# @Software    : PyCharm
# @Description :
import base64
import hashlib
import json

from Crypto.Cipher import AES


class AESCipher(object):
    def __init__(self, key):
        self.bs = AES.block_size
        self.key = hashlib.sha256(AESCipher.str_to_bytes(key)).digest()

    @staticmethod
    def str_to_bytes(data):
        u_type = type(b"".decode("utf8"))
        if isinstance(data, u_type):
            return data.encode("utf8")
        return data

    @staticmethod
    def _unpad(s):
        return s[: -ord(s[len(s) - 1:])]

    def decrypt(self, enc):
        iv = enc[: AES.block_size]
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return self._unpad(cipher.decrypt(enc[AES.block_size:]))

    def decrypt_string(self, enc):
        enc = base64.b64decode(enc)
        return self.decrypt(enc).decode("utf8")


def decrypt_data(encrypt_key, data):
    encrypt_data = data.get("encrypt")
    if encrypt_key == "" and encrypt_data is None:
        # data haven't been encrypted
        return data
    if encrypt_key == "":
        raise Exception("ENCRYPT_KEY is necessary")
    cipher = AESCipher(encrypt_key)

    return json.loads(cipher.decrypt_string(encrypt_data))
